package q2;

import java.util.concurrent.LinkedBlockingQueue;

/**
 * 公司
 * 用阻塞队列是因为：把显示器和键盘看成一个资源，队列就是资源池，而且阻塞队列也避免了我们去调用wait、notify方法来休眠、唤醒线程
 * @author：涂有
 * @date 2017年12月2日 下午5:32:41
 */
public class Company {
	
	/**公司拥有的显示器*/
	private LinkedBlockingQueue<Dispayer> dispayers = new LinkedBlockingQueue<>();
	/**公司拥有的键盘*/
	private LinkedBlockingQueue<Keyboard> keyboards = new LinkedBlockingQueue<>();
	
	public Company() {
		
		//初始化公司设备财产
		
		dispayers.add(new Dispayer("4K显示器"));
		dispayers.add(new Dispayer("低清显示器"));
//		dispayers.add(new Dispayer("高清显示器"));
		
		keyboards.add(new Keyboard("机械键盘"));
		keyboards.add(new Keyboard("闪光键盘"));
	}
	
	/**
	 * 程序员申请设备，需要键盘是显示器才能工作
	 * @author：涂有
	 * @date 2017年12月2日 下午5:47:41
	 */
	public DevelopTool applyTool(){
		try{
			//由于这里规定了大家都是先拿显示器、后拿键盘，所以不会发生死锁
			Dispayer dispayer = dispayers.take();
			Keyboard keyboard = keyboards.take();
			return new DevelopTool(dispayer, keyboard);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 退还开发工具
	 * @author：涂有
	 * @date 2017年12月2日 下午5:56:21
	 * @param tool 开发工具
	 */
	public void recyleTool(DevelopTool tool){
		dispayers.add(tool.getDispayer());
		keyboards.add(tool.getKeyboard());
	}
}
